{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Linear Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 实验说明\n",
    "\n",
    "这个实验使用线性回归分析广告投入和商品销量之间的关系.本实验需要调用sklearn库."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import Lasso, Ridge\n",
    "from sklearn.model_selection import GridSearchCV"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集说明\n",
    "\n",
    "Advertising数据集是一个关于广告投入和最终销量的数据集.有3个特征维度和1个标签维度.\n",
    "\n",
    "3个标签维度分别是商家在电视（TV）、广播（radio）和报纸（newspaper）广告上的投入.而对应商品的销售额（sales）可视为前三者的函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# pandas读入\n",
    "data = pd.read_csv('Advertising.csv')    # TV、Radio、Newspaper、Sales\n",
    "# print(data)\n",
    "x = data[['TV', 'Radio', 'Newspaper']]\n",
    "# x = data[['TV', 'Radio']]\n",
    "y = data['Sales']\n",
    "#print(x)\n",
    "#print(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "random_state 是随机数种子。\n",
    "\n",
    "随机数种子：其实就是该组随机数的编号，在需要重复试验的时候，保证得到一组一样的随机数。比如你每次都填1，\n",
    "\n",
    "其他参数一样的情况下你得到的随机数组是一样的。但填0或不填，每次都会不一样。随机数的产生取决于种子，随机\n",
    "\n",
    "数和种子之间的关系遵从以下两个规则：种子不同，产生不同的随机数；种子相同，即使实例不同也产生相同的随机数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha_can =  [   0.001         0.00359381    0.0129155     0.04641589    0.16681005\n",
      "    0.59948425    2.15443469    7.74263683   27.82559402  100.        ]\n"
     ]
    }
   ],
   "source": [
    "x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.8, test_size=0.2)\n",
    "model = Lasso()\n",
    "# model = Ridge()\n",
    "alpha_can = np.logspace(-3, 2, 10)\n",
    "np.set_printoptions(suppress=True)\n",
    "print('alpha_can = ', alpha_can)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "cv可以是整数或者交叉验证生成器或一个可迭代器，cv参数对应的4种输入列举如下：\n",
    "1. None：默认参数，函数会使用默认的3折交叉验证\n",
    "2. 整数k：k折交叉验证。对于分类任务，使用StratifiedKFold（类别平衡，每类的训练集占比一样多，具体可以查看官方文档）。\n",
    "    对于其他任务，使用KFold\n",
    "3. 交叉验证生成器：得自己写生成器，头疼，略\n",
    "4. 可以生成训练集与测试集的迭代器：同上，略\n",
    "\n",
    "注:\n",
    "1. 函数`Lasso`生成一个Lasso算法模型.这种算法有一组超参数,名叫alpha.\n",
    "1. `GridSearchCV`是sklearn提供的一个用于自动优化的工具.适用于数据量比较小的情况.在本实验中用于优化Lasso算法模型.\n",
    "1. 调用`GridSearchCV`构造函数时的参数`cv`是交叉验证参数.\n",
    "1. 调用`GridSearchCV`构造函数时的参数`param_grid`用于传入需要最优化的参数的取值.它是一个词典(同时传入参数名).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "超参数：\n",
      " {'alpha': 0.59948425031894093}\n",
      "lasso_model.score: 0.891103116143\n",
      "mse: 2.02267181952\n",
      "rmse: 1.42220667258\n"
     ]
    },
    {
     "data": {
      "image/png": "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\ngX79+tG8eXPGjx/P4sWLOX/+fK6gEBcXR61atQgPD6dz585kZGQAxsD38ssv4+TkRJcuXbh48SIA\nb7zxBpcvX5YuIAVh6lK5ffu2tO38+fNMmDDB6pY6GLs/TGVlZWWRmZlJuXLlzL5FZGdn58qXnp5O\nnTp1OHHiBG+99RYGg0F6z7R/IQTJycncvn2bli1b4ufnR+/evaWLi06nIyoqisGDB/Pll1+a3dw2\nlWG6yZofdevWxc/Pj8aNGzNhwgRp+/Tp01mzZg0XL17kueee44knngDgiSeekLqV/vrrL9atW8eU\nKVNIT0/nww8/pHz58lSsWJG5c+cWeLEE403nDz/8EBcXF957770C0yvYB0qwVwDgqaeeYteuXXTv\n3p2wsDCGDx/Ot99+CyD18d69e5fFixcTGRlJYmIi165d49y5cxw7doxatWpx5coVAgMDmTRpEn5+\nfoBxtEijRo145plnpC4KOZi6YkytU0Dqoni06yY/kpKSpGB//PhxBg8eXGAevV4v3XA18eOPPwLG\nwPvrr79K28+fP88zzzxjNnTV5O7s7My2bdv43//+xzfffMO0adNy7StnH3t+ODk5cezYMX744QfO\nnj3Lr7/+iru7O/DPhcPShdR0PwCM3UnNmzfH2dkZFxcXnJ2drQr2er0erVZbqIusQumjBHsFieee\ne46srCzmzp3Lp59+Kt2sW7duHTdv3uTKlSsADB48mGrVqtGhQwc6dOjAxx9/TOfOnblz5w6xsbG0\nb99eCvblypVDr9ejUqlydW+UBnfv3pWGHXbv3p3z589LLXtToEtKSsLLy0vK4+TkxN27d3Fzc+PP\nP/9k3rx53Llzh9mzZ+f6FpCZmYmDgwPNmjUjISHBosPnn3/OggULzG5qp6enA+Q7QulRWrZsSdWq\nVSlXrhxt2rSRtue812AJ0/uurq68/PLLAHh5eXHhwgWzbxbJyckAubb16tXL4k1eBftGCfYKEkII\n5syZQ6VKlaSRHgB79uyhfPnyDB48mIcPH9KpUye8vb0xGAwsWLCA3r1707x5czIzM/nzzz9p3769\nWbm9evXi3r173Lp1i+TkZBwcHMxu0Or1ejQaDR06dMhzhI6p2yTnCBpTMM3ZpfIoOp3O7Iaiv78/\nr776KgBVq1ale/fuufLExsbm2la/fn3A2PJWqVRUqVKFxMTEXPcRNBoNHh4eBd5c9vPz46mnnpIe\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1f43381dd30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lasso_model = GridSearchCV(model, param_grid={'alpha': alpha_can}, cv=5)\n",
    "lasso_model.fit(x_train, y_train)\n",
    "print('超参数：\\n', lasso_model.best_params_)\n",
    "\n",
    "# argsort()，返回从小到大排序后，原位置所对应的索引，而数组并没有排序\n",
    "order = y_test.argsort(axis=0)\n",
    "y_test = y_test.values[order]\n",
    "x_test = x_test.values[order, :]\n",
    "\n",
    "y_hat = lasso_model.predict(x_test)\n",
    "print('lasso_model.score:',lasso_model.score(x_test, y_test))\n",
    "mse = np.average((y_hat - np.array(y_test)) ** 2)  # Mean Squared Error\n",
    "rmse = np.sqrt(mse)  # Root Mean Squared Error\n",
    "print('mse:', mse)\n",
    "print('rmse:', rmse)\n",
    "\n",
    "t = np.arange(len(x_test))\n",
    "mpl.rcParams['font.sans-serif'] = [u'simHei']\n",
    "mpl.rcParams['axes.unicode_minus'] = False\n",
    "plt.figure(facecolor='w')\n",
    "plt.plot(t, y_test, 'r-', linewidth=2, label=u'真实数据')\n",
    "plt.plot(t, y_hat, 'g-', linewidth=2, label=u'预测数据')\n",
    "plt.title(u'线性回归预测销量', fontsize=18)\n",
    "plt.legend(loc='upper left')\n",
    "plt.grid(b=True, ls=':')\n",
    "plt.show()   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注:\n",
    "1. 线性回归预测销量的折线图中.横坐标不是在广告上的投入.而是样本的序号.\n",
    "1. 由于之前把测试样本按照销售量的大小进行了排序所以这里的折线图从左到右,销量越来越高."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
